from pydantic import BaseModel, EmailStr
from typing import Optional
from datetime import datetime
from enum import Enum

# 用户角色枚举
class UserRole(str, Enum):
    USER = "user"          # 普通用户
    ADMIN = "admin"        # 管理员

# 用户基础模式
class UserBase(BaseModel):
    # 用户名
    username: str
    # 邮箱，使用EmailStr类型进行验证
    email: EmailStr

# 用户创建模式，继承自UserBase
class UserCreate(UserBase):
    # 密码
    password: str
    # 角色，可选，默认为普通用户
    role: Optional[UserRole] = UserRole.USER

# 用户登录模式
class UserLogin(BaseModel):
    # 用户名
    username: str
    # 密码
    password: str

# 用户响应模式，继承自UserBase
class UserResponse(UserBase):
    # 用户ID
    id: int
    # 用户角色
    role: UserRole
    # 是否激活
    is_active: bool
    # 创建时间
    created_at: datetime
    
    # 配置类，用于ORM模型转换
    class Config:
        from_attributes = True
        # 配置时间序列化格式为易读格式
        json_encoders = {
            datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S") if v else None
        }

# 令牌模式
class Token(BaseModel):
    # 访问令牌
    access_token: str
    # 令牌类型
    token_type: str
    # 用户角色
    role: UserRole
    # 消息
    message: Optional[str] = "登录成功"

# 令牌数据模式
class TokenData(BaseModel):
    # 用户名，可选
    username: Optional[str] = None
    # 用户角色，可选
    role: Optional[UserRole] = None